export class AudioPlayer {
  private audioContext: UniApp.InnerAudioContext | null = null
  private url: string = ''

  constructor() {
    this.audioContext = uni.createInnerAudioContext()
    this.setupEventListeners()
  }

  private setupEventListeners() {
    if (!this.audioContext)
      return

    this.audioContext.onEnded(() => {
      console.log('音频播放结束')
    })

    this.audioContext.onError((res) => {
      console.error('音频播放错误:', res.errMsg)
    })
  }

  /**
   * 播放音频
   * @param url 音频文件URL
   * @returns Promise 播放成功返回 true，失败返回 false
   */
  async play(url: string): Promise<boolean> {
    try {
      if (!this.audioContext) {
        throw new Error('音频播放器未初始化')
      }

      // 如果是新的URL，则需要重新设置
      if (this.url !== url) {
        this.url = url
        this.audioContext.src = url
      }

      await this.stop()
      this.audioContext.play()
      return true
    }
    catch (error) {
      console.error('播放音频失败:', error)
      return false
    }
  }

  /**
   * 暂停播放
   */
  pause(): void {
    this.audioContext?.pause()
  }

  /**
   * 停止播放
   */
  async stop(): Promise<void> {
    if (this.audioContext) {
      this.audioContext.stop()
      // 等待一小段时间确保停止完成
      await new Promise(resolve => setTimeout(resolve, 50))
    }
  }

  /**
   * 设置音量
   * @param volume 音量值 (0.0 到 1.0)
   */
  setVolume(volume: number): void {
    if (this.audioContext) {
      this.audioContext.volume = Math.max(0, Math.min(1, volume))
    }
  }

  /**
   * 获取当前播放时间（秒）
   */
  getCurrentTime(): number {
    return this.audioContext?.currentTime || 0
  }

  /**
   * 获取音频总时长（秒）
   */
  getDuration(): number {
    return this.audioContext?.duration || 0
  }

  /**
   * 设置播放时间
   * @param time 要设置的时间（秒）
   */
  seek(time: number): void {
    if (this.audioContext) {
      this.audioContext.seek(time)
    }
  }

  /**
   * 是否正在播放
   */
  isPlaying(): boolean {
    return !!(this.audioContext && !this.audioContext.paused)
  }

  /**
   * 销毁音频实例，释放资源
   */
  destroy(): void {
    if (this.audioContext) {
      this.audioContext.destroy()
      this.audioContext = null
    }
  }
}
